[アップデート]GuardDutyのGetFindingsStatistics APIが更新され、日付やアカウント単位での統計がサポートされました

[アップデート]GuardDutyのGetFindingsStatistics APIが更新され、日付やアカウント単位での統計がサポートされました

GetFindingsStatistics APIを利用することでアカウント、日次数、検出タイプ、影響を受けるリソース単位での集計もできるようになりました
Clock Icon2024.09.28

こんにちは、臼田です。

みなさん、GuardDutyの検出状況の統計取ってますか?(挨拶

今回はいつものAmazon GuardDutyのアップデート通知にて下記内容を受け取ったのでこの確認をしていきます。

Amazon GuardDuty adds new functionality to the GetFindingsStatistics API. Customers can now query aggregate finding counts broken down by: account, daily counts, finding type, finding severity and affected resources. Link: https://docs.aws.amazon.com/guardduty/latest/APIReference/API_GetFindingsStatistics.html

概要

今回はGuardDutyのGetFindingsStatistics APIが更新されました。

このAPIはGuardDutyの検出状況の統計を取るためのAPIで、Severity(脅威のレベル)に応じてそれぞれ何件あるか集計してくれるAPIです。

これまではSeverity単位での集約だけだったのですが、今回のアップデートでは追加でアカウント、日次数、検出タイプ、影響を受けるリソースをそれぞれ指定して集計できるようになりました。

合わせて、旧来のAPI実行方法が非推奨となりました。

詳細な更新内容は以下にあります。

AWS API Changes

やってみた

今回のアップデートはbotocoreとしては1.35.17から対応しています。AWS CLI v1なら1.34.17、v2なら2.17.49から利用できます。

まず旧来の動作を確認します。

DID=$(aws guardduty list-detectors --query "DetectorIds" --output text)
aws guardduty get-findings-statistics --detector-id $DID --finding-statistic-types COUNT_BY_SEVERITY
{
    "FindingStatistics": {
        "CountBySeverity": {
            "8.0": 15,
            "2.0": 5,
            "5.0": 3
        }
    }
}

このように、--finding-statistic-types COUNT_BY_SEVERITYを指定することで結果を取得していました。

しかしこの方法は、APIリファレンスにて非推奨と記述されるようになりました。

findingStatisticTypes
This parameter has been deprecated.

今回は--finding-statistic-typesオプションに代わり--group-byオプションが追加され、このパラメータとして'ACCOUNT | DATE | FINDING_TYPE | RESOURCE | SEVERITY'が利用できるようになりました。元々のSeverity単位での集約も可能です。

ではやってみましょう。まずは既存の置き換えであるSeverityから。

aws guardduty get-findings-statistics --detector-id $DID --group-by SEVERITY
{
    "FindingStatistics": {
        "GroupedBySeverity": [
            {
                "LastGeneratedAt": "2024-09-15T18:22:16+00:00",
                "Severity": 8.0,
                "TotalFindings": 15
            },
            {
                "LastGeneratedAt": "2024-09-19T11:07:11+00:00",
                "Severity": 5.0,
                "TotalFindings": 3
            },
            {
                "LastGeneratedAt": "2024-09-26T14:45:41+00:00",
                "Severity": 2.0,
                "TotalFindings": 5
            }
        ]
    }
}

確認できる内容自体はだいたい一緒ですが、フォーマットが変わっていますので、既存の仕組みから単純置き換えができないので注意しましょう。

続いてリソース単位の集計をしてみます。

aws guardduty get-findings-statistics --detector-id $DID --group-by RESOURCE
{
    "FindingStatistics": {
        "GroupedByResource": [
            {
                "AccountId": "999999999999",
                "LastGeneratedAt": "2024-09-15T18:22:16+00:00",
                "ResourceId": "i-0XXXXXXXXXXXXXXXX",
                "ResourceType": "Instance",
                "TotalFindings": 17
            },
            {
                "AccountId": "999999999999",
                "LastGeneratedAt": "2024-09-26T14:45:41+00:00",
                "ResourceId": "ASIAXXXXXXXXXXXXXXXX",
                "ResourceType": "AccessKey",
                "TotalFindings": 4
            },
            {
                "AccountId": "999999999999",
                "LastGeneratedAt": "2024-09-15T18:22:16+00:00",
                "ResourceId": "guardduty-tester-RedTeamECSCluster",
                "ResourceType": "ECSCluster",
                "TotalFindings": 2
            }
        ]
    }
}

どのリソースで検出が多いか確認できて良いですね。

次はFinding Types毎見てみます。

aws guardduty get-findings-statistics --detector-id $DID --group-by FINDING_TYPE
{
    "FindingStatistics": {
        "GroupedByFindingType": [
            {
                "FindingType": "UnauthorizedAccess:EC2/SSHBruteForce",
                "LastGeneratedAt": "2024-09-15T18:00:41+00:00",
                "TotalFindings": 4
            },
            {
                "FindingType": "Backdoor:EC2/C&CActivity.B!DNS",
                "LastGeneratedAt": "2024-09-15T18:13:52+00:00",
                "TotalFindings": 2
            },
            {
                "FindingType": "CryptoCurrency:EC2/BitcoinTool.B!DNS",
                "LastGeneratedAt": "2024-09-15T18:13:56+00:00",
                "TotalFindings": 2
            },
            {
                "FindingType": "Execution:EC2/MaliciousFile",
                "LastGeneratedAt": "2024-09-15T18:22:16+00:00",
                "TotalFindings": 2
            },
            {
                "FindingType": "Execution:ECS/MaliciousFile",
                "LastGeneratedAt": "2024-09-15T18:22:16+00:00",
                "TotalFindings": 2
            },
            {
                "FindingType": "Recon:EC2/Portscan",
                "LastGeneratedAt": "2024-09-15T18:00:29+00:00",
                "TotalFindings": 2
            },
            {
                "FindingType": "Trojan:EC2/DNSDataExfiltration",
                "LastGeneratedAt": "2024-09-15T18:17:57+00:00",
                "TotalFindings": 2
            },
            {
                "FindingType": "UnauthorizedAccess:EC2/RDPBruteForce",
                "LastGeneratedAt": "2024-09-15T18:00:29+00:00",
                "TotalFindings": 2
            },
            {
                "FindingType": "Discovery:IAMUser/AnomalousBehavior",
                "LastGeneratedAt": "2024-09-19T11:07:11+00:00",
                "TotalFindings": 1
            },
            {
                "FindingType": "Execution:Runtime/ReverseShell",
                "LastGeneratedAt": "2024-08-09T17:56:55+00:00",
                "TotalFindings": 1
            },
            {
                "FindingType": "InitialAccess:IAMUser/AnomalousBehavior",
                "LastGeneratedAt": "2024-09-19T11:07:11+00:00",
                "TotalFindings": 1
            },
            {
                "FindingType": "Policy:S3/AccountBlockPublicAccessDisabled",
                "LastGeneratedAt": "2024-09-11T18:40:15+00:00",
                "TotalFindings": 1
            },
            {
                "FindingType": "Stealth:IAMUser/CloudTrailLoggingDisabled",
                "LastGeneratedAt": "2024-09-26T14:45:41+00:00",
                "TotalFindings": 1
            }
        ]
    }
}

これもよいですね。

日付単位を見てみましょう。

aws guardduty get-findings-statistics --detector-id $DID --group-by DATE
{
    "FindingStatistics": {
        "GroupedByDate": [
            {
                "Date": "2024-09-26T00:00:00+00:00",
                "LastGeneratedAt": "2024-09-26T14:45:41+00:00",
                "Severity": 2.0,
                "TotalFindings": 1
            },
            {
                "Date": "2024-09-19T00:00:00+00:00",
                "LastGeneratedAt": "2024-09-19T11:07:11+00:00",
                "Severity": 2.0,
                "TotalFindings": 1
            },
            {
                "Date": "2024-09-19T00:00:00+00:00",
                "LastGeneratedAt": "2024-09-19T11:07:11+00:00",
                "Severity": 5.0,
                "TotalFindings": 1
            },
            {
                "Date": "2024-09-15T00:00:00+00:00",
                "LastGeneratedAt": "2024-09-15T18:22:16+00:00",
                "Severity": 8.0,
                "TotalFindings": 7
            },
            {
                "Date": "2024-09-15T00:00:00+00:00",
                "LastGeneratedAt": "2024-09-15T18:00:41+00:00",
                "Severity": 2.0,
                "TotalFindings": 1
            },
            {
                "Date": "2024-09-15T00:00:00+00:00",
                "LastGeneratedAt": "2024-09-15T18:00:29+00:00",
                "Severity": 5.0,
                "TotalFindings": 1
            },
            {
                "Date": "2024-09-12T00:00:00+00:00",
                "LastGeneratedAt": "2024-09-12T18:09:52+00:00",
                "Severity": 8.0,
                "TotalFindings": 5
            },
            {
                "Date": "2024-09-12T00:00:00+00:00",
                "LastGeneratedAt": "2024-09-12T17:52:31+00:00",
                "Severity": 2.0,
                "TotalFindings": 1
            },
            {
                "Date": "2024-09-12T00:00:00+00:00",
                "LastGeneratedAt": "2024-09-12T17:52:36+00:00",
                "Severity": 5.0,
                "TotalFindings": 1
            },
            {
                "Date": "2024-09-11T00:00:00+00:00",
                "LastGeneratedAt": "2024-09-11T21:10:23+00:00",
                "Severity": 8.0,
                "TotalFindings": 2
            },
            {
                "Date": "2024-09-11T00:00:00+00:00",
                "LastGeneratedAt": "2024-09-11T18:40:15+00:00",
                "Severity": 2.0,
                "TotalFindings": 1
            },
            {
                "Date": "2024-08-09T00:00:00+00:00",
                "LastGeneratedAt": "2024-08-09T17:56:55+00:00",
                "Severity": 8.0,
                "TotalFindings": 1
            }
        ]
    }
}

こちらは想定と少し違って、日付単位でかつSeverity毎に集計されていますね。単純に日付だけで集計したい場合には、追加の処理が必要そうです。

最後にアカウント単位です。

aws guardduty get-findings-statistics --detector-id $DID --group-by ACCOUNT
{
    "FindingStatistics": {
        "GroupedByAccount": [
            {
                "AccountId": "999999999999",
                "LastGeneratedAt": "2024-09-26T14:45:41+00:00",
                "TotalFindings": 23
            }
        ]
    }
}

上記はアカウントが1つなので寂しいですが、複数のアカウントを集約している場合にはいい感じに見れると思います。

まとめ

GuardDutyのGetFindingsStatistics APIの更新内容を確認しました。

これまで以上にいろんな統計が出せるので、是非活用していきましょう!

この記事をシェアする

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.